#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

//int addToTarget(int from, int to)
//{
//    int sum = 0;
//    for(int i = from; i < to; i++)
//    {
//        sum += i;
//    }
//  //  exit(); //库函数
//  //  _exit(31); // 系统调用
//    //return sum;
//}
//
int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        //子进程
        int cnt = 5;
        while(cnt)
        {
            printf("我是子进程: %d, 父进程: %d, cnt: %d\n", getpid(), getppid(), cnt--);
            sleep(1);
            int *p = NULL;
            *p = 100;//空指针解引用，异常退出
        }
        // 运行完
        // 1. 代码完，结果对
        // 2. 代码完，结果不对
        // 异常
        // 3. 代码没跑完，出异常了
        exit(12); //进程退出
    }
    // 父进程
    //sleep(15);
    //pid_t ret = wait(NULL);
    int status = 0; // 不是被整体使用的，有自己的位图结构，前8位表示终止状态码，后8位表示终止信号,当一个进程非正常退出时，说明该进程是被信号所杀，那么该进程的退出码也就没有意义了
    pid_t ret = waitpid(id, &status, 0);//等待成功返回被等待进程的pid。
    if(id > 0)
    {
        printf("wait success: %d, sig number: %d, child exit code: %d\n", ret, (status & 0x7F), (status>>8)&0xFF);
    }

    sleep(5);

//    printf("hello bit!");
//    sleep(2);
//    _exit(1);//exit()会刷新缓冲区，_exit()不会刷新
//
  //  printf("hello world\n");

  //  int ret = addToTarget(0, 100);
  //  printf("sum=%d\n", ret);

  //  while(1) sleep(1);

    //for(int i = 0 ;i < 200; i++)
    //{
    //    printf("%d: %s\n", i, strerror(i));
    //}

    //写代码是为了完成某件事情，我如何得知我的任务跑的如何呢？
    //进程退出码
    //int num = addToTarget(1, 100);
    //if(num == 5050)
    //    return 0;
    //else
    //    return 1;
    // 一般而言，退出码，都必须有对应的退出码的文字描述，1. 可以自定义  2. 可以使用系统的映射关系（不太频繁）
    // 退出码的意义：0:success, !0:标识失败， !0具体是几，标识不同的错误 -- 数字对人不友好，对计算机友好
    // 如何设定main函数返回值呢？？如果不关心进程退出码，return 0就行
    // 如果未来我们是要关心进程退出码的时候，要返回特定的数据表明特定的错误
    // 进程退出的时候，对应的退出码
    // 标定进程执行的结果是否正确
    // return 0;
}
